package br.com.vti.leilao.view.converter;

import java.math.BigDecimal;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;

import com.sun.faces.util.MessageFactory;
import javax.faces.component.UIInput;

/** 
 * Classe responsavel por converter os campos de texto cpf, cep, cnpj ou telefone.
 * 
 * @author Ednardo Rubens
 * 
 */
public class TextConverter implements Converter {

    /* (non-Javadoc)
     * @see javax.faces.convert.Converter#getAsObject(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.String)
     */
    @Override
    public Object getAsObject(FacesContext context,
            UIComponent component, String value)
            throws ConverterException {
        String retorno = null;
        if (value != null && !value.isEmpty()) {
            String type = String.valueOf(component.getAttributes().get("type"));
            try {
                if (type.equalsIgnoreCase("cpf")
                        || type.equalsIgnoreCase("cep")
                        || type.equalsIgnoreCase("cnpj")
                        || type.equalsIgnoreCase("telefone")) {
                    retorno = value.replaceAll("[^0-9]", "");
                    Double.parseDouble(retorno);
                } else if (type.equalsIgnoreCase("porcentagem")
                        || type.equalsIgnoreCase("moeda")
                        || type.equalsIgnoreCase("decimal")) {
                    retorno = value.replaceAll("[^0-9,]", "").replaceAll("[,]", ".");
                    return new BigDecimal(retorno);
                }
            } catch (Exception e) {
                Object label = MessageFactory.getLabel(context, component);
                String erro_converter = "erro.converter";
                String msg = null;
                try {
                    FacesMessage message = MessageFactory.getMessage(context, erro_converter, label);
                    msg = message.getSummary();
                    UIInput input = (UIInput) component;
                    input.setConverterMessage(msg);
                } catch (Exception ex) {
                }
                throw new ConverterException(msg);
            }
        }
        return retorno;
    }

    /* (non-Javadoc)
     * @see javax.faces.convert.Converter#getAsString(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)
     */
    @Override
    public String getAsString(FacesContext context,
            UIComponent component, Object value)
            throws ConverterException {
        if (value != null && !value.equals("")) {
            String type = String.valueOf(component.getAttributes().get("type"));
            String retorno = String.valueOf(value);
            if (type.equalsIgnoreCase("cpf")
                    && retorno.length() > 9) {
                retorno = retorno.substring(0, 3) + "."
                        + retorno.substring(3, 6) + "."
                        + retorno.substring(6, 9) + "-"
                        + retorno.substring(9);
            } else if (type.equalsIgnoreCase("cep")
                    && retorno.length() > 5) {
                retorno = retorno.substring(0, 5) + "-"
                        + retorno.substring(5);
            } else if (type.equalsIgnoreCase("cnpj")
                    && retorno.length() > 12) {
                retorno = retorno.substring(0, 2) + "."
                        + retorno.substring(2, 5) + "."
                        + retorno.substring(5, 8) + "/"
                        + retorno.substring(8, 12) + "-"
                        + retorno.substring(12);
            } else if (type.equalsIgnoreCase("telefone")
                    && retorno.length() > 6) {
                retorno = "(" + retorno.substring(0, 2) + ")"
                        + retorno.substring(2, 6) + "."
                        + retorno.substring(6);
            } else if (type.equalsIgnoreCase("porcentagem")) {
                retorno = formatarDecimal(retorno) + "%";
            } else if (type.equalsIgnoreCase("moeda")) {
                retorno = "R$ " + formatarDecimal(retorno);
            } else if (type.equalsIgnoreCase("decimal")) {
                retorno = formatarDecimal(retorno);
            }
            return retorno;
        } else {
            return "";
        }
    }

    protected String formatarDecimal(String retorno) {
        retorno = retorno.replaceAll("[.]", ",");
        if (!retorno.contains(",")) {
            retorno += ",00";
        }
        int tam = retorno.length();
        if (retorno.substring(tam - 2, tam - 1).equals(",")) {
            retorno += "0";
        }
        int pos = retorno.indexOf(",") - 3;
        while (pos > 0) {
            retorno = retorno.substring(0, pos) + "."
                    + retorno.substring(pos, tam);
            pos -= 3;
            tam += 1;
        }
        return retorno;
    }
}